/*
 * 你刚被MacroMuscle有限公司聘用。该公司准备进入欧洲市场，需要一个把英寸单位转换为厘米单位（1英寸=2.54厘米）的程序。该程序要提示用户输入英寸值。 
 * */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

//检查输入的字符串是否为double型
bool is_valid_double(const char *input){ // 用const告诉别人自己不会修改这个函数
	char *endptr;                    // 用于存储strtod函数停止转换的位置
	strtod(input,&endptr);           // 把input的字符逐一写入*endptr
	return *endptr=='\0';            // null终止符，用于表示字符串的结束
}

int main(){
	char input[100];
        double num;	
	while(1){
		printf("这是一个把英寸转换为厘米的程序，请输入你要转化的值，q退出：");
		scanf("%s",input);
		if(input[0] == 'q')      // 这里必须使用单引号，因为单引号代表字符常量，双引号代表字符串常量
		{
			printf("退出。\n");
			break;
		}
		else if(!is_valid_double(input))
		{
			printf("输入不合法。\n");
			continue;
		}
		else
		{
			num=atof(input);
			if(num<0){
				printf("不能输入负值!\n");
				continue;
			}
			printf("%.2lf厘米\n",num*2.54);
		}
		
	}
	return 0;
}

/* 为什么结尾为'\0'就可以判断是double？
 * 在C语言中，字符串是以null终止符('\0')结尾的字符数组。
 * 而strtod()函数会尝试将输入的字符串解析为double型数值，
 * 当遇到非数字字符时停止解析，返回解析过的部分，
 * 因此当解析结束时，endptr指向的位置就是字符串中第一个不能解析为double型数值的字符的位置。
 * 因此，当endptr指向的字符是null终止符('\0')时，说明strtod()函数已经解析了整个字符串，没有遇到非法字符，
 * 即整个字符串都可以被解析为double型数值。因此，我们可以根据*endptr == '\0'来判断整个字符串是否为有效的double型数值。
 * */
